import eslint from '@eslint/js'
// import globals from 'globals'
import tseslint from 'typescript-eslint'
import eslintPluginVue from 'eslint-plugin-vue'
// import stylistic from '@stylistic/eslint-plugin'
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'

export default [
  {
    ignores: [
      '**/dist/**',
      '**/dist-ssr/**',
      '**/coverage/**',
      '/dist',
      '.idea',
      '.vscode',
      '*.sh',
      '**/node_modules',
      '*.md',
      '*.woff',
      'yarn.lock',
      'package-lock.json',
      '/public',
      '/docs',
      '**/output',
      '.husky',
      '.local',
      '/bin',
      'Dockerfile',
    ],
  },

  /** js推荐配置 */
  eslint.configs.recommended,
  /** ts推荐配置 */
  ...tseslint.configs.recommended,
  /** vue推荐配置 */
  ...eslintPluginVue.configs['flat/recommended'],

  // stylistic.configs.customize({
  //   indent: 2,
  //   quotes: 'single',
  //   semi: false,
  //   jsx: true,
  //   braceStyle: '1tbs',
  //   arrowParens: 'always',
  // }),

  /**
   * javascript 规则
   */
  {
    files: ['**/*.{js,mjs,cjs,vue}'],
    rules: {
      // 强制一致的代码风格
      quotes: ['error', 'single'], // 强制使用单引号而非双引号
      semi: ['error', 'never'], // 禁止使用分号（即无分号风格）
      indent: ['error', 2], // 强制使用 2 个空格进行缩进

      // 代码清晰性与可维护性
      'no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], // 警告未使用的变量，忽略以 _ 开头的变量
      'no-console': ['warn', { allow: ['warn', 'error'] }], // 警告使用 console，允许使用 console.warn 和 console.error
      'no-debugger': 'warn', // 警告使用 debugger

      // 代码正确性
      eqeqeq: ['error', 'always'], // 强制使用严格相等（=== 和 !==），避免隐式类型转换
      'no-duplicate-imports': 'error', // 禁止重复导入同一个模块
      'no-else-return': 'error', // 如果 if 语句中已经有 return 语句，则不需要 else 语句

      // 代码结构与维护性
      'consistent-return': 'error', // 强制函数返回值的一致性，要么总是返回值，要么从不返回值
      'max-lines': ['warn', 300], // 警告文件行数超过 300 行，保持文件结构清晰
      complexity: ['warn', 10], // 限制函数复杂度为 10，避免函数过于复杂
      // 箭头函数使用
      'prefer-arrow-callback': 'error', // 强制使用箭头函数定义回调
      'arrow-spacing': ['error', { before: true, after: true }], // 强制箭头函数前后有空格
    },
    languageOptions: {
      globals: {
        module: 'readonly', // Define `module` as a global variable
      },
      sourceType: 'module',
    },
  },

  /**
   * vue 规则
   */
  {
    files: ['**/*.vue'],
    languageOptions: {
      parserOptions: {
        /** typescript项目需要用到这个 */
        parser: tseslint.parser,
        ecmaVersion: 'latest',
        /** 允许在.vue 文件中使用 JSX */
        ecmaFeatures: {
          jsx: true,
        },
      },
    },
    rules: {
      // 在这里追加 vue 规则
      'vue/no-mutating-props': [
        'error',
        {
          shallowOnly: true,
        },
      ],
      'vue/no-unused-vars': 'warn',
      // 警告 Vue 模板中未使用的变量
      'vue/valid-v-for': 'error',
      // 强制 v-for 语句的正确性
      'vue/operator-linebreak': 'off',
      //关闭操作符换行规则的检查。默认ESLint会要求你在操作符前后换行，配置项可关闭这种检查。
      'vue/singleline-html-element-content-newline': 'off',
      //关闭单行 HTML 元素内容新行的规则。默认情况下，ESLint 可能会要求在单行 HTML 元素的内容后面有新行，这个配置项可以关闭这种要求。
      'vue/multi-word-component-names': 'off',
      //关闭组件名称必须是多单词的规则。默认情况下，ESLint 可能会要求组件名称由多个单词组成，这个配置项允许单词少于两个的组件名称。
      'vue/no-v-model-argument': 'off',
      //关闭对 `v-model` 参数使用的规则。默认情况下，ESLint 可能会对 `v-model` 的参数使用进行检查，这个配置项可以关闭这种检查。
      'vue/require-default-prop': 'off',
      //关闭要求组件 `prop` 必须有默认值的规则。默认情况下，ESLint 可能会要求每个 `prop` 都有一个默认值，这个配置项允许没有默认值的 `prop`。
      'vue/require-prop-types': 'off',
      //关闭要求组件 `prop` 必须有类型定义的规则。默认情况下，ESLint 可能会要求每个 `prop` 都有一个类型定义，这个配置项允许没有类型定义的 `prop`。
      'vue/html-self-closing': 'off',
      //关闭 HTML 自闭合标签规则的检查。默认情况下，ESLint 可能会要求 HTML 标签自闭合的风格，这个配置项可以关闭这种检查。
      'vue/quote-props': 'off',
      //关闭属性名引号使用规则的检查。默认情况下，ESLint 可能会要求在对象属性名周围使用引号，这个配置项可以关闭这种检查。
      'vue/no-irregular-whitespace': 'off',
      //关闭检查不规则空白字符的规则。默认情况下，ESLint 可能会检查代码中是否有不规则的空白字符，这个配置项可以关闭这种检查。
      'vue/prop-name-casing': 'off',
      //关闭 `prop` 名称大小写规则的检查。默认情况下，ESLint 可能会要求 `prop` 名称遵循特定的大小写规则，这个配置项可以关闭这种要求。
      'vue/html-indent': 'off',
      //关闭 HTML 缩进规则的检查。默认情况下，ESLint 可能会要求 HTML 标签按照特定的缩进方式对齐，这个配置项可以关闭这种检查。
      'vue/no-reserved-component-names': 'off',
      //关闭对保留组件名称的检查。默认情况下，ESLint 可能会禁止使用某些保留的组件名称，这个配置项允许使用这些名称。
    },
  },

  /**
   * typescript 规则
   */
  {
    files: ['**/*.{ts,tsx,vue}'],
    rules: {
      '@typescript-eslint/no-explicit-any': 'off',
      '@typescript-eslint/no-unused-expressions': [
        'error',
        {
          allowShortCircuit: true, // 允许短路表达式 (e.g., `a && b`)
          allowTernary: true, // 允许三元表达式
        },
      ],
    },
  },

  /**
   * prettier 配置
   * 会合并根目录下的prettier.config.js 文件
   * @see https://prettier.io/docs/en/options
   */
  eslintPluginPrettierRecommended,
]
